/**
 * 请求根路径
 */
const BASE_URL: string = 'https://gmall-prod.atguigu.cn/skb';
/**
 * 超时时间
 */
const TIME_OUT: number = 5000;

/**
 * 定义响应体内容
 */
interface R<T> {
    /**
     * 请求状态码
     */
    code: number;
    /**
     * 请求响应信息
     */
    message: string;
    /**
     * 请求响应内容
     */
    data: T;
}
// https://uniapp.dcloud.net.cn/api/request/request.html#request
class Service {
    /**
     * 异步请求函数
     * @param optiopns
     * @returns R<T>
     */
    api<T>(optiopns: UniApp.RequestOptions) {
        // 1. 返回请求方法
        return new Promise<R<T>>((resolve, reject) => {
            // 2. 发送请求
            uni.request({
                // 3. 解构参数
                ...optiopns,
                // 4.请求成功
                success(res: any) {
                    // 5. 判断请求的状态码
                    if (res.statusCode >= 200 && res.statusCode < 300) {
                        // 6. 返回成功的 Promise
                        resolve(res.data as R<T>);
                    }
                },
                fail(error) {
                    reject(error);
                },
            });
        });
    }
    /**
     * GET 请求
     * @param url 请求路径
     * @param data 请求体参数
     * @param header 自定义请求头
     * @returns R<T>
     */
    GET<T>(url: string, data?: string | AnyObject | ArrayBuffer, header?: any) {
        return this.api<T>({
            url,
            data,
            header,
            method: 'GET',
        });
    }
    /**
     *
     * @param url 请求路径
     * @param data 请求体参数
     * @param header 自定义请求头
     * @returns R<T>
     */
    POST<T>(url: string, data?: string | AnyObject | ArrayBuffer, header?: any) {
        return this.api<T>({
            url,
            data,
            header,
            method: 'POST',
        });
    }
    /**
     *
     * @param url 请求路径
     * @param data 请求体参数
     * @param header 自定义请求头
     * @returns R<T>
     */
    DELETE<T>(url: string, data?: string | AnyObject | ArrayBuffer, header?: any) {
        return this.api<T>({
            url,
            data,
            header,
            method: 'DELETE',
        });
    }
}

//uniapp.dcloud.net.cn/api/interceptor.html#addinterceptor
/**
 * 添加拦截器
 */
uni.addInterceptor('request', {
    // 拦截前触发
    invoke(options: UniApp.RequestOptions) {
        // 1. 判断请求是否携带 http 不携带则添加统一基础路径
        if (!options.url.startsWith('http')) {
            options.url = BASE_URL + options.url;
        }
        // 2. 添加超时时间
        options.timeout = TIME_OUT;
        // 3. 添加请求头
        options.header = {
            ...options.header,
        };
        // 4. 添加 token
        const token = uni.getStorageSync('TOKEN');
        if (token) {
            options.header.token = token;
        }
    },
});

// 导出 service
const service = new Service();
export default service;
